Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

416
Views
Parámetro de ruta con barra inclinada "/" en URL

Sé que puede aplicar un comodín en el atributo de ruta para permitir / como la entrada de fecha, por ejemplo:

 [Route("orders/{*orderdate}")]

El problema con el comodín solo se aplica al último parámetro en URI. ¿Cómo resuelvo el problema si quiero tener el siguiente URI:

 [Route("orders/{orderdate}/customers")]

Actualizar:

Sé que hay pocas opciones para resolver el problema refactorizando el código, así que no ofrezca una solución como:

  1. cambie la plantilla de ruta a [Route("orders/customers/{orderdate}")]
  2. cambiar la fecha a un formato diferente (por ejemplo, "dd-mm-yyyy" )
over 4 years ago · Santiago Trujillo
3 answers
Answer question

0

@bet... Creo que genericUriParserOptions ya no es aplicable a .net 4.5 o posterior...

También como lo sugiere @JotaBe , es posible que deba decodificar correctamente la solicitud de URL. En la mayoría de los casos, %2F se traducirá automáticamente a una barra inclinada '/' . Entonces, si necesita escapar, deberá decodificar el carácter '%' en primer lugar ... por lo que su URL: se verá así: www.domain.com/api/orders/23%252F06%252F2015/customers

Observe que los caracteres '%252F' se traducirán al '%2F' real

EDITAR

Ok, aquí está la solución completa (lo probé y funcionó para mí):

  1. Suponiendo que tiene un punto final de API como este:

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { }
  2. En web.config , deberá configurar requestPathInvalidCharacters para que esté vacío, lo que le indica a asp.net que permita todas las solicitudes

     <system.web> <httpRuntime targetFramework="4.5" requestPathInvalidCharacters=""/> </system.web> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer>
  3. Cuando el cliente envíe la solicitud a la API, deberá asegurarse de escapar del '%' siguiente manera:

    www.dominio.com/api/pedidos/23%252F06%252F2015/clientes

  4. A continuación, debe decodificar la solicitud.

     [Route("orders/{date}/customers")] public HttpResponseMessage Get(string date) { DateTime actualDate = DateTime.Parse(System.Net.WebUtility.UrlDecode(date)); // date is 23/06/2015 }
over 4 years ago · Santiago Trujillo Report

0

Como se señaló en el comentario de @AlexeiLevenkov, esto está mal:

No puede tener un parámetro en la URL que acepte barras diagonales, porque este es un símbolo especial que separa cada fragmento de URL. Por lo tanto, cada vez que incluya este símbolo en su URL, habrá nuevos fragmentos y un solo parámetro no puede incluir varios fragmentos.

Si quieres más detalles, lee esto , pero estos son los extractos más relevantes:

  • la ruta URL termina en el primero ? o # encontrado en la URL. Por lo tanto, las barras inclinadas solo crean fragmentos en la sección de la ruta de la URL antes de la ocurrencia de uno de esos símbolos.
  • De la sección 3.4: El componente de consulta se indica con el primer carácter de signo de interrogación ("?") y termina con un carácter de signo de número ("#") o al final del URI.

Por lo tanto, la cadena de consulta puede incluir barras diagonales, / , si lo desea, y no definirán segmentos de ruta en absoluto.

Estas son algunas soluciones para la pregunta:

  • incluya fragmentos para el día, el mes y el año, como este: [Route("orders/{month}/{day}/{year}/customers")] y luego cree la fecha en el lado del servidor
  • requiere que el usuario use un separador diferente, como un guión o un punto, que no creará problemas, recíbalo en una cadena y analícelo usted mismo (o use su propio archivador personalizado para admitir ese formato)
  • use la extensión de reescritura de URL para cambiar la URL antes de que llegue al sistema de enrutamiento y analícela como se explica en la solución anterior (esto requiere hospedaje en IIS)
  • recíbalo como una cadena de consulta, es decir, algo como esto: ´?date=02/03/2015´ (será mejor que lo codifique)

NOTA: su pregunta original decía "cadena de consulta", y mi comentario sobre la codificación se refería a la cadena de consulta, que es el último segmento de una URL después del signo de interrogación, si está presente, like &id=27 . Corregí su pregunta para que no mencione "cadena de consulta", que no era el nombre correcto para lo que necesita

over 4 years ago · Santiago Trujillo Report

0

Puede usar el siguiente URI [Route("orders/{DD:int}/{MM:int}/{YY:int}}/customers")] y luego usar un archivador de modelo personalizado para tomar DD/MM/YY y conviértalos en una fecha que pueda vincular en su método de acción.

Puede elegir cómo desea manejar las restricciones (ser más estricto con las expresiones regulares) o usar la validación y devolver 400 si no coincide.

El enfoque más simple es tomar el Day/Month/Year y juntarlo en código.

Aquí hay un enlace para tratar con modelbinding .

over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!